/**
 *                            License
 * THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS  
 * CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). 
 * THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.  
 * ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR  
 * COPYRIGHT LAW IS PROHIBITED.
 * 
 * BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND  
 * AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE  
 * MAY BE CONSIDERED TO BE A CONTRACT,
 * THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED 
 * HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
 * 
 */
package com.lineage.server.templates;

import java.io.Serializable;

/**
 * Class <code>L1MobSkill</code> 数据库模板:怪物技能.
 * 
 * @author jrwz
 * @version 2012-6-17上午04:34:31
 * @see com.lineage.server.templates
 * @since JDK1.7
 */
public final class L1MobSkill implements Cloneable, Serializable {

    /** 序列版本UID. */
    private static final long serialVersionUID = 1L;
    /** 类型:空. */
    public static final int TYPE_NONE = 0;
    /** 类型:物理攻击. */
    public static final int TYPE_PHYSICAL_ATTACK = 1;
    /** 类型:魔法攻击. */
    public static final int TYPE_MAGIC_ATTACK = 2;
    /** 类型:召唤. */
    public static final int TYPE_SUMMON = 3;
    /** 类型:变身. */
    public static final int TYPE_POLY = 4;
    /** 目标无变化. */
    public static final int CHANGE_TARGET_NO = 0;
    /** 改变目标:同伴. */
    public static final int CHANGE_TARGET_COMPANION = 1;
    /** 改变目标:自己. */
    public static final int CHANGE_TARGET_ME = 2;
    /** 改变目标:随机. */
    public static final int CHANGE_TARGET_RANDOM = 3;
    /** 技能大小. */
    private final int skillSize;
    /** 怪物编号. */
    private int mobid;
    /** 怪物名称. */
    private String mobName;
    /** 技能类型 0→不采取行动、1→物理攻击、2→魔法攻击、3→召唤怪物. */
    private final int[] type;
    /** 技能范围. */
    private final int[] skillArea;
    /** 魔力消耗. */
    private final int[] mpConsume;
    /** 技能发动条件：随机发动概率（0%～100%）. */
    private final int[] triRnd;
    /** 技能发动条件：HP%以下发动. */
    private final int[] triHp;
    /** 技能发动条件：同族的HP%低于以下发动. */
    private final int[] triCompanionHp;
    /**
     * 技能发动条件：triRange<0 对象距离triRange以下发动
     * triRange>0 对象距离triRange以上发动.
     */
    private final int[] triRange;
    /** 触发次数. */
    private final int[] triCount;
    /** 技能发动时、改变目标. */
    private final int[] changeTarget;
    /** 范围攻击:近战物理攻击设置1以上. */
    private final int[] range;
    /** 范围攻击的宽度:单体攻击设定0、范围攻击设定1以上. */
    private final int[] areaWidth;
    /** 范围攻击的高度:单体攻击设定0、范围攻击设定1以上. */
    private final int[] areaHeight;
    /** 伤害倍率、1/10。物理攻击、魔法攻击共同有效. */
    private final int[] leverage;
    /** 魔法攻击技能编号. */
    private final int[] skillId;
    /** 物理攻击动画编号. */
    private final int[] gfxid;
    /** 物理攻击动作编号. */
    private final int[] actid;
    /** 召唤怪的NPC编号. */
    private final int[] summon;
    /** 召唤怪的最低数量. */
    private final int[] summonMin;
    /** 召唤怪的最高数量. */
    private final int[] summonMax;
    /** 强制变身ID. */
    private final int[] polyId;

    /**
     * 数据库模板:怪物技能.
     * 
     * @param size
     *            技能大小
     */
    public L1MobSkill(final int size) {
        this.skillSize = size;
        this.type = new int[this.skillSize];
        this.mpConsume = new int[this.skillSize];
        this.triRnd = new int[this.skillSize];
        this.triHp = new int[this.skillSize];
        this.triCompanionHp = new int[this.skillSize];
        this.triRange = new int[this.skillSize];
        this.triCount = new int[this.skillSize];
        this.changeTarget = new int[this.skillSize];
        this.range = new int[this.skillSize];
        this.areaWidth = new int[this.skillSize];
        this.areaHeight = new int[this.skillSize];
        this.leverage = new int[this.skillSize];
        this.skillId = new int[this.skillSize];
        this.skillArea = new int[this.skillSize];
        this.gfxid = new int[this.skillSize];
        this.actid = new int[this.skillSize];
        this.summon = new int[this.skillSize];
        this.summonMin = new int[this.skillSize];
        this.summonMax = new int[this.skillSize];
        this.polyId = new int[this.skillSize];
    }

    @Override
    public L1MobSkill clone() {
        try {
            return (L1MobSkill) (super.clone());
        } catch (final CloneNotSupportedException e) {
            throw (new InternalError(e.getMessage()));
        }
    }

    /**
     * 取得物理攻击动作编号.
     * 
     * @param idx
     *            参数
     * @return 物理攻击动作编号
     */
    public int getActid(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.actid[idx];
    }

    /**
     * 取得范围攻击的高度.
     * 
     * @param idx
     *            参数
     * @return 范围攻击的高度
     */
    public int getAreaHeight(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.areaHeight[idx];
    }

    /**
     * 取得范围攻击的宽度.
     * 
     * @param idx
     *            参数
     * @return 范围攻击的宽度
     */
    public int getAreaWidth(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.areaWidth[idx];
    }

    /**
     * 取得技能发动时、改变目标.
     * 
     * @param idx
     *            参数
     * @return 技能发动时、改变目标
     */
    public int getChangeTarget(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.changeTarget[idx];
    }

    /**
     * 取得物理攻击动画编号.
     * 
     * @param idx
     *            参数
     * @return 物理攻击动画编号
     */
    public int getGfxid(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.gfxid[idx];
    }

    /**
     * 取得伤害倍率.
     * 
     * @param idx
     *            参数
     * @return 伤害倍率
     */
    public int getLeverage(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.leverage[idx];
    }

    /**
     * 取得怪物编号.
     * 
     * @return 怪物编号
     */
    public int getMobId() {
        return this.mobid;
    }

    /**
     * 取得怪物名称.
     * 
     * @return 怪物名称
     */
    public String getMobName() {
        return this.mobName;
    }

    /**
     * 取得魔力消耗.
     * 
     * @param idx
     *            参数
     * @return 魔力消耗
     */
    public int getMpConsume(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.mpConsume[idx];
    }

    /**
     * 取得强制变身编号.
     * 
     * @param idx
     *            参数
     * @return 强制变身编号
     */
    public int getPolyId(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.polyId[idx];
    }

    /**
     * 取得范围攻击的距离.
     * 
     * @param idx
     *            参数
     * @return 范围攻击的距离
     */
    public int getRange(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.range[idx];
    }

    /**
     * 取得技能范围.
     * 
     * @param idx
     *            参数
     * @return 技能范围
     */
    public int getSkillArea(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.skillArea[idx];
    }

    /**
     * 取得技能编号.
     * 
     * @param idx
     *            参数
     * @return 技能编号
     */
    public int getSkillId(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.skillId[idx];
    }

    /**
     * 取得技能大小.
     * 
     * @return 技能大小
     */
    public int getSkillSize() {
        return this.skillSize;
    }

    /**
     * 取得召唤怪的NPC编号.
     * 
     * @param idx
     *            参数
     * @return 召唤怪的NPC编号
     */
    public int getSummon(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.summon[idx];
    }

    /**
     * 取得召唤怪的最高数量.
     * 
     * @param idx
     *            参数
     * @return 召唤怪的最高数量
     */
    public int getSummonMax(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.summonMax[idx];
    }

    /**
     * 取得召唤怪的最低数量.
     * 
     * @param idx
     *            参数
     * @return 召唤怪的最低数量
     */
    public int getSummonMin(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.summonMin[idx];
    }

    /**
     * 取得同族HP%以下发动.
     * 
     * @param idx
     *            参数
     * @return 同族HP%以下发动
     */
    public int getTriggerCompanionHp(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.triCompanionHp[idx];
    }

    /**
     * 取得技能发动条件：技能的发动次数triCount以下发动.
     * 
     * @param idx
     *            参数
     * @return 触发次数
     */
    public int getTriggerCount(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.triCount[idx];
    }

    /**
     * 取得HP%以下发动.
     * 
     * @param idx
     *            参数
     * @return HP%以下发动
     */
    public int getTriggerHp(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.triHp[idx];
    }

    /**
     * 取得随机发动概率（0%～100%）.
     * 
     * @param idx
     *            参数
     * @return 随机发动概率（0%～100%）
     */
    public int getTriggerRandom(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.triRnd[idx];
    }

    /**
     * 取得技能触发范围.
     * 
     * @param idx
     *            参数
     * @return 技能触发范围
     */
    public int getTriggerRange(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.triRange[idx];
    }

    /**
     * 取得技能类型.
     * 
     * @param idx
     *            参数
     * @return 技能类型
     */
    public int getType(final int idx) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return 0;
        }
        return this.type[idx];
    }

    /**
     * distance指定idx技能的发动条件.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     * @return true or false
     */
    public boolean isTriggerDistance(final int idx, final int i) {
        final int triggerRange = this.getTriggerRange(idx);

        if (((triggerRange < 0) && (i <= Math.abs(triggerRange)))
                || ((triggerRange > 0) && (i >= triggerRange))) {
            return true;
        }
        return false;
    }

    /**
     * 设置物理攻击动作编号.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setActid(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.actid[idx] = i;
    }

    /**
     * 设置范围攻击的高度.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setAreaHeight(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.areaHeight[idx] = i;
    }

    /**
     * 设置范围攻击的宽度.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setAreaWidth(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.areaWidth[idx] = i;
    }

    /**
     * 设置技能发动时、改变目标.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setChangeTarget(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.changeTarget[idx] = i;
    }

    /**
     * 设置物理攻击动画编号.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setGfxid(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.gfxid[idx] = i;
    }

    /**
     * 设置伤害倍率.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setLeverage(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.leverage[idx] = i;
    }

    /**
     * 设置怪物编号.
     * 
     * @param i
     *            编号
     */
    public void setMobId(final int i) {
        this.mobid = i;
    }

    /**
     * 设置怪物名称.
     * 
     * @param s
     *            名称
     */
    public void setMobName(final String s) {
        this.mobName = s;
    }

    /**
     * 设置魔力消耗.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setMpConsume(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.mpConsume[idx] = i;
    }

    /**
     * 设置强制变身编号.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setPolyId(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.polyId[idx] = i;
    }

    /**
     * 设置范围攻击的距离.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setRange(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.range[idx] = i;
    }

    /**
     * 设置技能范围.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setSkillArea(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.skillArea[idx] = i;
    }

    /**
     * 设置技能ID.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setSkillId(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.skillId[idx] = i;
    }

    /**
     * 设置召唤怪的NPC编号.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setSummon(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.summon[idx] = i;
    }

    /**
     * 设置召唤怪的最高数量.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setSummonMax(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.summonMax[idx] = i;
    }

    /**
     * 设置召唤怪的最低数量.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setSummonMin(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.summonMin[idx] = i;
    }

    /**
     * 设置同族HP%以下发动.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setTriggerCompanionHp(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.triCompanionHp[idx] = i;
    }

    /**
     * 设置技能触发次数.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setTriggerCount(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.triCount[idx] = i;
    }

    /**
     * 设置HP%以下发动.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setTriggerHp(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.triHp[idx] = i;
    }

    /**
     * 设置随机发动概率（0%～100%）.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setTriggerRandom(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.triRnd[idx] = i;
    }

    /**
     * 设置技能触发范围.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setTriggerRange(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.triRange[idx] = i;
    }

    /**
     * 设置技能类型.
     * 
     * @param idx
     *            参数
     * @param i
     *            参数
     */
    public void setType(final int idx, final int i) {
        if ((idx < 0) || (idx >= this.getSkillSize())) {
            return;
        }
        this.type[idx] = i;
    }
}
